package jp.hoge.RSSReader;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.util.Xml;

public class ParseXml {
	private String last_build_date = new String();
	
	public String getLastBuildDate(){
		return this.last_build_date;
	}

	public ArrayList<RowModel> ParseXmlPullparser(InputStream is) {
		List<RowModel> rowModelList = new ArrayList<RowModel>();

		try {
			// 解析対象のストリームを取得する
			XmlPullParser parser = null;

			// TODO 【XMLPull】 No.01 XmlPullParserを定義する
			parser = Xml.newPullParser();
			// TODO 【XMLPull】 No.02 パースする文字列のストリームを渡す
			parser.setInput(new InputStreamReader(is));

			int eventType = 0;
			// XmlPullParser パースしている階層を取得
			final int depth = parser.getDepth();
			// XmlPullParser パースの終了条件
			/* TODO 【XMLPull】 No.03 while文で一つずつ処理をする */
			while (((eventType = parser.next()) != XmlPullParser.END_DOCUMENT)
					|| (parser.getDepth() > depth)) {
				// XmlPullParser eventTypeが開始タグか判定
				if (eventType == XmlPullParser.START_TAG) {
					// XmlPullParser タグの名前を取得する
					String tag = parser.getName();
					
					// ここでlastBuildDateを取得する。
					// lastBuildDateとpubDateのフォーマットは"EEE, d MMM yyyy HH:mm:ss Z"
					if("lastBuildDate".equals(tag)){
						parser.next();
						// parserからテキスト情報を取得するが、セットするのは後で。
						last_build_date = parser.getText();
						last_build_date = ChangeFormat(last_build_date);
					}
					
					// XmlPullParser タグの名前が"item"なら、parseToRowModelを呼び出す
					if ("item".equals(tag)) {
						rowModelList.add(parseToRowModel(parser));
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();

		} finally {
			if (is != null) {
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return (ArrayList<RowModel>)rowModelList;
	}

	private RowModel parseToRowModel(XmlPullParser parser)
			throws XmlPullParserException, IOException {
		RowModel rowModel = new RowModel();
		int eventType;
		String tag = null;
		// パースする階層を取得する
		final int depth = parser.getDepth();
		// パースの終了条件
		while (((eventType = parser.next()) != XmlPullParser.END_DOCUMENT || parser
				.getDepth() > depth)) {
			// eventTypeが開始タグか判定
			if (eventType == XmlPullParser.START_TAG) {
				tag = parser.getName();
				// TODO 【XMLPull】 No.04 <entry>の中の<id>タグの値を取得し、RowModelに値をセットする
				if ("title".equals(tag)) {
					// 次に移動する。
					parser.next();
					// parserからテキスト情報を取得し、rowModelのURLにセットする。
					rowModel.setTitle(parser.getText());

				} else if ("link".equals(tag)) {
					parser.next();
					rowModel.setLink(parser.getText());

				} else if ("description".equals(tag)) {
					parser.next();
					rowModel.setDescription(parser.getText());

				} else if ("pubDate".equals(tag)) {
					parser.next();
					rowModel.setDate(parser.getText());
					
					// レコード作成終了前にlastBuildDateをセットする
					rowModel.setLast_Build_Date(last_build_date);
					break;
				}
			}
		}
		return rowModel;
	}
	
	public String ChangeFormat(String date) {
		String[] month_e = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
		String[] month_i = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"};
		String[] dow = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "dum","dum","dum","dum","dum"};
		int count;
		
		date = date.substring(0, date.length() -5);
		date = date.replace(",", "");
		date = date.replaceAll(" ", "");
		date = date.replaceAll(":", "");
		
		for(count = 0; count < month_e.length; count++){
			date = date.replace(month_e[count], month_i[count]);
			date = date.replace(dow[count], "");
		}

		SimpleDateFormat df = new SimpleDateFormat("ddMMyyyyHHmmss");
		Date d = null;
		try {
			d = df.parse(date);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		df.applyPattern("yyyyMMddHHmmss");
		date = df.format(d);
		
		return date;
	}
}
